#include <iostream>
#include <functional>
#include <string>
#include <vector>

// 我们可以将bind接口看作是⼀个通用的函数适配器，它接受⼀个函数对象，以及函数的各项参数，然
// 后返回⼀个新的函数对象，但是这个函数对象的参数已经被绑定为设置的参数。运行的时候相当于总是调用传⼊固定参数的原函数。
// 但是如果进行绑定的时候，给与的参数为 `std::placeholders::_1, _2...` 则相当于为新适配⽣成的函数对象的调用预留⼀个参数进行传递

void print(const std::string & str,int number)
{
    std::cout<<str<<":"<<number<<std::endl;
}


// int main()
// {
//     print("hello",10);
//     std::function<void(int)> func= std::bind(print,"dijia",std::placeholders::_1);
//     func(20);
//     return 0;
// }

// 基于bind的作用，当我们在设计⼀些线程池，或者任务池的时候，就可以将任务池中的任务设置为
// 函数类型，函数的参数由添加任务者直接使用bind进⾏适配绑定设置，⽽任务池中的任务被处理，只需要取出⼀个个的函数进行执行即可。
// 这样做有个好处就是，这种任务池在设计的时候，不⽤考虑都有哪些任务处理方式了，处理函数该如何设计，有多少个什么样的参数，这些都不用考虑了，降低了代码之间的耦合度。


int main()
{
    using Task = std::function<void()>;
    std::vector<Task> array;
    array.push_back(std::bind(print,"hello",10));
    array.push_back(std::bind(print,"dijia",20));
    array.push_back(std::bind(print,"aoteman",30));
    for(auto &f:array)
    {
        f();
    }
    return 0;
}